package com.kevinkk.array;

import java.util.Scanner;

/**
 * 在一个城市区域内，被划分成了n * m个连续的区块，每个区块都拥有不同的权值，代表着其土地价值。目前，有两家开发公司，A 公司和 B 公司，希望购买这个城市区域的土地。
 * 现在，需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
 * 然而，由于城市规划的限制，只允许将区域按横向或纵向划分成两个子区域，而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争，你需要找到一种分配方式，使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
 * 注意：区块不可再分。
 *
 * 这也是一道前缀和的题目，但是需要注意的是，这是一道二维的前缀和
 * 需要统一计算水平方向和垂直方向的和
 */

public class DevelopersPurchaseLand {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[][] arr = new int[n][m], preSum = new int[n][m];
        int totalSum = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                arr[i][j] = sc.nextInt();
                totalSum += arr[i][j];
            }
        }

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                preSum[i][j] = arr[i][j];
                if(i > 0) preSum[i][j] += preSum[i-1][j];
                if(j > 0) preSum[i][j] += preSum[i][j-1];
                // 注意去重
                if(i > 0 && j > 0) preSum[i][j] -= preSum[i-1][j-1];
            }
        }

        int res = Integer.MAX_VALUE;
        // 水平分割
        for(int i = 1; i < n; i++){
            int upSum = preSum[i-1][m-1];
            int downSum = totalSum - upSum;
            res = Math.min(res, Math.abs(upSum - downSum));
        }

        // 垂直分割
        for(int i = 1; i < m; i++){
            int leftSum = preSum[n-1][i-1];
            int rightSum = totalSum - leftSum;
            res = Math.min(res, Math.abs(leftSum - rightSum));
        }

        System.out.println(res);
    }
}
